<?php


/*********	数据库 增 、删 、改 、查 函数	*********/


//数据库连接
/**
*	@功能:	链接数据库的函数
*	@parse1: 主机名
*	@parse2: 用户名			
*	@parse3: 密码
*	@parse4: 操作的数据库名
*	@parse5: 要设置的字符集
*	@返回值: 数据库连接资源
*/
function myConnect($host, $user , $pwd , $dbName , $charset) {
	
	$link = mysqli_connect($host , $user , $pwd);
	//var_dump($link);
	
	if (!$link) {
		
		exit('数据库连接失败');
	}

	$db = mysqli_select_db($link , $dbName);

	if (!$db) {
		exit('数据库名输入有误');
	}
	
	mysqli_set_charset($link , $charset);
	
	return $link;

}



// 插入数据的函数
/**
*	@功能:	插入数据库数据的函数
*	@parse1: 数据连接的资源
*	@parse2: 数据表			
*	@parse3: 插入的数组(插入用的键,值)
*	@返回值: 插入数据的自增id /false(插入是否成功)
*/

function myInsert($link , $table ,$data) {
	//var_dump($data);
	//获取所有键
	$key = array_keys($data);
	//var_dump($key);
	
	//获取所有值
	$value = array_values($data);
	//var_dump($value);
	
	//调用自定义函数,给字符串加上单引号
	$values = parseValue($value);	//返回一个索引数组
	//var_dump($values);
	
	$keyString = join(',' , $key);
	$valString = join(',' , $values);
	$sql = "insert into $table($keyString) values($valString)";
	// var_dump($sql);

	$result = mysqli_query($link , $sql);
	
	if ($result && mysqli_affected_rows($link)) {
		
		return mysqli_insert_id($link);
	} 
	return false;
}

//var_dump(myInsert($link , 'think_data', ['name'=> '面霸' ,'price'=>3223 , 'regtime'=>1332477223 , 'place'=>'百度']));


//处理插入数组的值(给每个字符串元素的值加上单引号)
/**
*	@功能:	给数组中元素值为字符串的加上单引号
*	@parse1: 数组
*	@返回值: 加上单引号后的新数组
*/

function parseValue($data) {
	
	foreach ($data as $key => $value) {
		
		if (is_string($value)) {
			$val = '\'' . $value . '\'';
			$newData[$key] = $val;
			
		} else {
			$newData[$key] = $value ;
		}
	}
	return $newData;
}



//定义一个查询数据库的函数
/**
*	@功能:	查询数据库数据的函数
*	@parse1: 数据连接的资源
*	@parse2: 查询的字段(字符串格式:'name,age,id,sex')			
*	@parse3: 数据表
*	@parse4: 查询的条件
*	@返回值: 查询结果(二维数组)/false
*/

function mySelect($link , $field , $table , $where = null) {
	
	$sql = "select $field from $table $where ";
	// var_dump($sql);

	$result = mysqli_query($link , $sql);
	
	//处理结果集
	if ($result && mysqli_affected_rows($link)) {
		while ($data = mysqli_fetch_assoc($result)) {
			
			$newData[] = $data;
		}
		return $newData;
	}
	return false;
}

//$find = mySelect($link, 'name , price', 'think_data', 'order by price desc');
//var_dump($find);




//定义一个删除数据的函数 
//	注意: 防止删除整个数据库,因此$where无默认值
/**
*	@功能:	删除数据库数据的函数
*	@parse1: 数据连接的资源
*	@parse2: 数据表			
*	@parse3: 删除数据的条件
*	@返回值: 受影响行数/false(删除的行数/删除失败)
*/


function myDelete($link , $table , $where) {
	
	$sql = "delete from $table where $where";
	// var_dump($sql);
	
	$result = mysqli_query($link , $sql);
	if ($result && mysqli_affected_rows($link)) {
		
		return mysqli_affected_rows($link);
	}
	return false;
}
//$del = myDelete($link , 'think_data', 'id in (144,145,146)');
//var_dump($del);

//sql注入,直接清空数据表,[条件恒成立]
//$del2 = myDelete($link , 'suser', 'uid=1 or 1=1');
//$del2 = myDelete($link , 'suser' , '1=1');
//var_dump($del2);

// 定义一个修改数据行的函数
/**
*	@功能:	修改数据库数据的函数
*	@parse1: 数据连接的资源
*	@parse2: 数据表			
*	@parse3: 修改的数组(修改用的键,值)
*	@parse4: 修改条件
*	@返回值: true/false(修改是否成功)
*/

function myUpdate($link , $table, $data , $where) {

	// var_dump($data);
	//给数组值为字符串的加上单引号
	$newData = parseValue($data);
	//将数组拼接成sql中所需的字符串(格式: name='值1',age=12,sex='男')
	$updateStr = parseUpdate($newData);
	// var_dump($updateStr);

	$sql = "update $table set $updateStr where $where";
	// var_dump($sql);
	
	$result = mysqli_query($link , $sql);
	//var_dump($result);
	
	//处理结果集
	if ($result && mysqli_affected_rows($link)) {
		return true;
	}
	return false;
	
}

//$update = myUpdate($link, 'think_data' , ['name'=> '葫芦娃' , 'price'=>520,'place'=>'宝钢a'] , 'id=143');
//var_dump($update);


//定义一个拼接出 name='值1',age=12,sex='男' 的函数
/**
*	@功能:	修改数据库数据的函数
*	@parse1: 需要拼接成字符串的数组
*	@返回值: 拼接好的字符串(格式,如:"name='值1',age=21,sex='男'")
*/

function parseUpdate($data) {
	
	// var_dump($data);
	//遍历拿出所有键,值,并拼接成字符串,再存入数组中
	foreach ($data as $key => $value) {
		
		//var_dump($key,$value);
		//拼接成字符串并存入数组中
		$newData[] = $key . '=' . $value;

	}
	// var_dump($newData);
	
	//将数组拼接成字符串
	$updateStr = join(',' , $newData);
	// var_dump($updateStr);

	//返回字符串
	return $updateStr;
}


// 定义一个计算总个数的函数
/**
*	@功能:	计算某个字段的总个数的函数
*	@parse1: 数据连接的资源
*	@parse2: 某个字段名(一般为主键:唯一性)			
*	@parse3: 数据表
*	@parse4: 查询条件(默认查全表)
*	@返回值: 总个数/false
*/

function myCount($link , $field , $table , $where=null) {
	
	$sql = "select count($field) as count from $table $where";
	// var_dump($sql);

	$result = mysqli_query($link , $sql);
	
	//处理结果集
	if ($result && mysqli_affected_rows($link)) {
		
		$count = mysqli_fetch_assoc($result);
		//var_dump($count['count(id)']);  //区别名后,原名失效
		//var_dump($count['count']);
		
		return $count['count'];
	}
	return false;
}

//$count = myCount($link , 'name' , 'think_data');
//$count = myCount($link , 'uid' , 'bbs_user','where uid<10');
//var_dump($count);



// 定义一个计算某个字段所有数值总和 的函数
/**
*	@功能:	计算某个字段所有数值总和 的函数
*	@parse1: 数据连接的资源
*	@parse2: 某个字段名(一般为主键:唯一性)			
*	@parse3: 数据表
*	@parse4: 查询条件(默认查全表)
*	@返回值: 计算总和/false
*/

function mySum($link , $field , $table, $where=null) {
	
	$sql = "select sum($field) as sum from $table $where";
	$result = mysqli_query($link , $sql);
	
	//处理结果集
	if ($result && mysqli_affected_rows($link)) {
		$sum = mysqli_fetch_assoc($result);
		//var_dump($sum);
		
		return $sum['sum'];
	}
	return false;
}


//封装一个分页函数
/** 
*	@功能:		分页函数
*	@param1: 数据库连接资源
*	@param2: 每页显示数
*	@param3: 主键字段名(用于查询数据表数据总条数)
*	@param4: 查询的数据表
*	@param5:  查询总条数时的条件  (也可使用顺序依据: order by )
*	@返回值: 打包返回一个三维数组
*/

function myPage($link , $num = 4 , $field = 'id', $table = 'think_data',  $where = null) {
	
	//var_dump($orderby);
	
	//页面初始化
	//$page = 1;
	$page = isset($_GET['page']) ? $_GET['page'] : 1;

	//总条数 
	$count = myCount($link , $field , $table, $where);
	//var_dump($count);

	//总页数 = 总条数 / 每页显示数
	$total = ceil($count / $num);

	//判断页数范围
	if ($page > $total) {
		$page = $total;
	}
	if ($page < 1) {
		$page = 1;
	}
	
	//上一页
	$prev = $page - 1;
	if ($prev < 1) {
		$prev = 1;
	}
	
	//下一页
	$next = $page + 1;
	if ($next > $total) {
		$next = $total;
	}

	//偏移量
	$offset = ($page - 1) * $num;

	//分页sql语句
	$sql = "select * from $table $where limit $offset,$num";
	// var_dump($sql);

	$res = mysqli_query($link , $sql);
	
	//处理结果集
	if ($res && mysqli_affected_rows($link)) {
		
		//生成二维数组 索引=>关联 数组
		while ($rows = mysqli_fetch_all($res , MYSQLI_ASSOC)) {
			
			//var_dump($rows);
			//$data = compact('prev' , 'next' , 'total', 'rows');
			$data = compact('prev' , 'next' , 'count' ,'total' , 'offset' , 'num' , 'rows');
			//var_dump($data);
			return $data;
		}
		//var_dump($rows);
		
	}
	return false;
}


